﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

using RRHH.Competencias.Controladores;
using RRHH.Competencias.Entities;
using System.Text.RegularExpressions;

namespace WebSite
{
    public partial class Colaboradores : System.Web.UI.Page
    {        
        protected string codigoPantalla = "COLABORADORES";

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                if (!Master.ValidarAcceso(codigoPantalla)) Response.Redirect("Inicio.aspx");

                Session["ABMColaboradores.GrdColaboradores.PageIndex"] = 0;
                Session["ABMColaboradores.lstColaboradores"] = null;
                Session["ABMColaboradores.colaboradorUpdate"] = null;

                this.mpeDatosColaborador.Hide();
                this.mpeBajaColaborador.Hide();

                try
                {

                    CargarComboSectores();
                    CargarComboMotivoBaja();
                    BuscarDatos(null, null, null, null, null, null, null, null, chkActivo.Checked);

                }
                catch (Exception ex)
                {
                    this.RegistrarMensajeJavascript("Error", ex.Message);
                }
            }
        }

        protected void cmdNuevo_Click(object sender, ImageClickEventArgs e)
        {
            this.mpeDatosColaborador.Show();
            this.secConsultaMotivoBaja.Visible = false;
            this.updDetalleColaborador.Update();
        }

        protected void cmdCancelar_Click(object sender, ImageClickEventArgs e)
        {
            this.mpeDatosColaborador.Hide();
            this.UpdListadoColaboradores.Update();
        }

        private void RegistrarMensajeJavascript(string nombre, string mensaje)
        {
            mensaje = mensaje.Replace("'", string.Empty);
            mensaje = mensaje.Replace("(", string.Empty);
            mensaje = mensaje.Replace(")", string.Empty);
            mensaje = mensaje.Replace(",", string.Empty);
            mensaje = mensaje.Replace(";", string.Empty);
            mensaje = mensaje.Replace("\"", string.Empty);

            ScriptManager.RegisterStartupScript(this, this.GetType(), nombre, "alert('" + mensaje + "');", true);
        }


        private void CargarComboSectores()
        {
            GestorSector gestorSector = new GestorSector();

            try
            {
                List<Sector> lstSectores = new List<Sector>();
                Sector sector = new Sector();

                lstSectores = gestorSector.BuscarTodos(true);

                sector.Id = -1;
                sector.Nombre = "Selecione un sector";
                lstSectores.Insert(0, sector);

                ddlSector.DataSource = lstSectores;
                ddlSector.DataTextField = "Nombre";
                ddlSector.DataValueField = "Id";
                ddlSector.DataBind();
            }
            catch (Exception)
            {
                this.RegistrarMensajeJavascript("Error", "No se pudieron obtener los sectores");
            }
        }

        private void CargarComboMotivoBaja()
        {
            GestorEnumerador<MotivoBajaColaborador> gestorMotivo = new GestorEnumerador<MotivoBajaColaborador>();

            try
            {
                List<MotivoBajaColaborador> lstMotivo = gestorMotivo.Enumeracion;
                MotivoBajaColaborador motivoBaja = new MotivoBajaColaborador();

                motivoBaja.Id = -1;
                motivoBaja.Nombre = "[TODOS]";
                lstMotivo.Insert(0, motivoBaja);

                DdlMotivoBaja.DataSource = lstMotivo;
                DdlMotivoBaja.DataTextField = "Nombre";
                DdlMotivoBaja.DataValueField = "Id";
                DdlMotivoBaja.DataBind();

                ddlMotivoBajaConsulta.DataSource = lstMotivo;
                ddlMotivoBajaConsulta.DataTextField = "Nombre";
                ddlMotivoBajaConsulta.DataValueField = "Id";
                ddlMotivoBajaConsulta.DataBind();

            }
            catch (Exception)
            {

            }
        }

        private void BuscarDatos(long? colaborador_id, string legajo, string nombre, string apellido,
                                 string domicilio, string mail, string telefono, string telefonoMovil,
                                 bool activo)
        {           

            if (legajo == string.Empty)
            {
                legajo = null;
            }

            if (apellido == string.Empty)
            {
                apellido = null;
            }


            GestorColaborador gestorColaborador = new GestorColaborador();
            List<Colaborador> lstColaboradores = new List<Colaborador>();

            try
            {
                lstColaboradores = gestorColaborador.Buscar(colaborador_id, legajo, nombre, apellido, domicilio,
                                                        mail, telefono, telefonoMovil, activo);

                GrdColaboradores.DataKeyNames = new string[] { "Legajo", "IdColaborador" };

                GrdColaboradores.DataSource = lstColaboradores;
                GrdColaboradores.PageIndex = (int)Session["ABMColaboradores.GrdColaboradores.PageIndex"];
                GrdColaboradores.DataBind();

                Session["ABMColaboradores.lstColaboradores"] = lstColaboradores;

                
            }
            catch (Exception)
            {
                this.RegistrarMensajeJavascript("Error", "No se pudo obtener el listado de Colaboradores");
            }

        }

       
        protected void GrdColaboradores_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            int indiceFila = Convert.ToInt32(e.CommandArgument);
            GestorColaborador gestorColaborador = new GestorColaborador();

           
            switch(e.CommandName)
            {
                case "Modificar":
           
                    try
                    {
                        List<Colaborador> lstColaborador = new List<Colaborador>();
                        lstColaborador = (List<Colaborador>)Session["ABMColaboradores.lstColaboradores"];
                        Colaborador colaboradorUpdate = new Colaborador();

                        indiceFila = Convert.ToInt16(e.CommandArgument);
                        Int64 idColaborador = Convert.ToInt64(GrdColaboradores.DataKeys[indiceFila].Values["IdColaborador"]);

                        foreach (Colaborador colaborador in lstColaborador)
                        {
                            if (colaborador.IdColaborador == idColaborador)
                            {
                                colaboradorUpdate = colaborador;
                                Session["ABMColaboradores.colaboradorUpdate"] = colaboradorUpdate;
                                break;
                            }
                        }

                        CompletarCampos(colaboradorUpdate);

                        this.mpeDatosColaborador.Show();
                       
                        
                    }
                    catch (Exception)
                    {
                        this.RegistrarMensajeJavascript("Error", "");
                        return;
                    }

                    break;

                case "Activar":
            
                    try
                    {
                        List<Colaborador> lstColaborador = new List<Colaborador>();
                        lstColaborador = (List<Colaborador>)Session["ABMColaboradores.lstColaboradores"];
                        Colaborador colaboradorActivar = new Colaborador();

                        indiceFila = Convert.ToInt16(e.CommandArgument);
                        Int64 idColaborador = Convert.ToInt64(GrdColaboradores.DataKeys[indiceFila].Values["IdColaborador"]);

                        foreach (Colaborador colaborador in lstColaborador)
                        {
                            if (colaborador.IdColaborador == idColaborador)
                            {
                                colaboradorActivar.IdColaborador = idColaborador;
                                break;
                            }
                        }

                        gestorColaborador.Activar(colaboradorActivar);

                        BuscarDatos(null, null, null, null, null, null, null, null, chkActivo.Checked);
                    }

                    catch (Exception)
                    {
                        this.RegistrarMensajeJavascript("Error","No se pudo activar el Colaborador");
                        return;
                    }

                    break;
                case "Desactivar":
                
                    Session["ABMColaboradores.IndiceFila"] = Convert.ToInt16(e.CommandArgument);
                    LimpiarCampos();
                    this.mpeBajaColaborador.Show();
                    break;
                default:
                    break;
            }
        }

        private void LimpiarCampos()
        {
            txtLegajo.Text = string.Empty;
            txtNombres.Text = string.Empty;
            txtApellido.Text = string.Empty;
            txtDomicilio.Text = string.Empty;
            txtEmail.Text = string.Empty;
            txtTelFijo.Text = string.Empty;
            txtTelMovil.Text = string.Empty;
            ddlSector.SelectedIndex = 0;

            txtObservacionBaja.Text = string.Empty;
            DdlMotivoBaja.SelectedIndex = 0;
            txtFechaIngreso.Text = string.Empty;
            txtObservaciones.Text = string.Empty;

            txtComentariosBajaConsulta.Text = string.Empty;
            //ddlMotivoBajaConsulta.SelectedIndex = 0;
            txtFecBajaConsulta.Text = string.Empty;
        }

        private void CompletarCampos(Colaborador colaborador)
        {
            if (colaborador != null)
            {
                txtLegajo.Text = colaborador.Legajo;
                txtNombres.Text = colaborador.Nombre;
                txtApellido.Text = colaborador.Apellido;
                txtDomicilio.Text = colaborador.Domicilio;
                txtEmail.Text = colaborador.Mail;
                txtTelFijo.Text = colaborador.Telefono;
                txtTelMovil.Text = colaborador.TelefonoMovil;
                txtObservaciones.Text = colaborador.Observaciones;

               

                //Buscamos si el Ciclo esta en el ddl. Si esta lo seleccionamos, sino apuntamos a "-- Seleccionar --"
                if ((ListItem)ddlSector.Items.FindByValue(colaborador.Sector.Id.ToString()) != null)
                {
                    ddlSector.SelectedValue = colaborador.Sector.Id.ToString();
                }
                else
                {
                    ddlSector.SelectedIndex = 0;
                }

                if (colaborador.FechaIngreso > DateTime.MinValue) txtFechaIngreso.Text = colaborador.FechaIngreso.ToShortDateString();
                else txtFechaIngreso.Text = string.Empty;

                if ((ListItem)ddlMotivoBajaConsulta.Items.FindByValue(colaborador.MotivoBaja.Id.ToString()) != null)
                {
                    this.secConsultaMotivoBaja.Visible = true;
                    ddlMotivoBajaConsulta.SelectedValue = colaborador.MotivoBaja.Id.ToString();
                    txtComentariosBajaConsulta.Text = colaborador.ObservacionesBaja;
                    txtFecBajaConsulta.Text = colaborador.FechaBaja.ToShortDateString();                    
                }
                else
                {
                    this.secConsultaMotivoBaja.Visible = false;
                    //DdlMotivoBaja.SelectedIndex = 0;
                    //txtComentariosBajaConsulta.Text = string.Empty;
                    //txtFecBajaConsulta.Text = string.Empty;                   
                }

                this.updDetalleColaborador.Update();
            }
        }

        protected void GrdColaboradores_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            Session["ABMColaboradores.GrdColaboradores.PageIndex"] = e.NewPageIndex;
            this.BuscarDatos(null, txtLegajoBuscar.Text,null, txtApellidoBuscar.Text, null, null, null, null, chkActivo.Checked);
        }

        protected void cmdGuardar_Click(object sender, ImageClickEventArgs e)
        {
            string errores = string.Empty;
            string erroresImagen = string.Empty;
            GestorColaborador gestorColaborador = new GestorColaborador();
            Colaborador colaborador = new Colaborador();
            Colaborador colaboradorAnterior = null;

            if (!this.ValidarDatos(out errores))
            {
                ScriptManager.RegisterStartupScript(this, this.GetType(), "Error", "alert('" + errores + "')", true);
                return;
            }

            try
            {
                colaborador.Legajo = txtLegajo.Text;
                colaborador.Nombre = txtNombres.Text;
                colaborador.Apellido = txtApellido.Text;
                colaborador.Domicilio = txtDomicilio.Text;
                colaborador.Mail = txtEmail.Text;
                colaborador.Telefono = txtTelFijo.Text;
                colaborador.TelefonoMovil = txtTelMovil.Text;
                colaborador.Sector = new Sector();
                colaborador.Sector.Id = Convert.ToInt64(ddlSector.SelectedValue);
                colaborador.Observaciones = txtObservaciones.Text;

               
                if (txtFechaIngreso.Text != string.Empty) colaborador.FechaIngreso = Convert.ToDateTime(txtFechaIngreso.Text);
                else colaborador.FechaIngreso = DateTime.MinValue;

                if (secConsultaMotivoBaja.Visible)
                {
                    colaborador.MotivoBaja = new MotivoBajaColaborador();
                    colaborador.MotivoBaja.Id = Convert.ToInt64( ddlMotivoBajaConsulta.SelectedValue );
                    colaborador.ObservacionesBaja = txtComentariosBajaConsulta.Text;

                    colaborador.FechaBaja = Convert.ToDateTime( txtFecBajaConsulta.Text );
                }
                else
                {

                }

                if (Session["ABMColaboradores.colaboradorUpdate"] != null)//Modificación Colaborador
                {
                    colaboradorAnterior = new Colaborador();
                    colaboradorAnterior = (Colaborador)Session["ABMColaboradores.colaboradorUpdate"];

                    colaborador.Id = colaboradorAnterior.Id;
                    colaborador.IdColaborador = colaboradorAnterior.IdColaborador;

                    gestorColaborador.Modificar(colaborador);

                    Session["ABMColaboradores.colaboradorUpdate"] = null;


                }
                else//Nuevo Colaborador
                {
                    gestorColaborador.Registrar(colaborador);

                    this.RegistrarMensajeJavascript("Error", "La operación  se registró correctamente");
                }

                this.RegistrarMensajeJavascript("Aviso","La operación se registró correctamente");                
                BuscarDatos(null, null, null, null, null, null, null, null, chkActivo.Checked);
                UpdListadoColaboradores.Update();
                mpeDatosColaborador.Hide();
            }
            catch (Exception)
            {
                this.RegistrarMensajeJavascript("Error", "No se pudo registrar la operación");
                return;
            }

            if (colaboradorAnterior != null)//Registrar Log de Modificación de Colaborador
            {
            }

            BuscarDatos(null, txtLegajoBuscar.Text, null, txtApellidoBuscar.Text, null, null, null, null, true);
        }

        protected bool ValidarDatos(out string errores)
        {
            errores = string.Empty;

            if (txtLegajo.Text.Trim().Length == 0)
            {
                errores = "Debe ingresar un legajo";
                return false;
            }

            if (txtNombres.Text.Trim().Length == 0)
            {
                errores = "Debe ingresar un nombre";
                return false;
            }

            if (txtApellido.Text.Trim().Length == 0)
            {
                errores = "Debe ingresar un apellido";
                return false;
            }

            if (txtEmail.Text != string.Empty)
            {
                //Valida el mail
                Regex r = new Regex(@"^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$");
                MatchCollection mc = r.Matches(txtEmail.Text);
                if (mc.Count != 1)//Valor ingresado correcto con respecto a expresion regular
                {
                    errores = "Debe ingresar un e-mail en formato valido";
                    return false;
                }
            }

            if (ddlSector.SelectedValue == "-1")
            {
                errores = "Debe seleccionar un Sector";
                return false;
            }

            //if (ddlMotivoBajaConsultada.Visible == true)
            //{
            //    if (ddlMotivoBajaConsultada.SelectedValue == "-1")
            //    {
            //        errores = "Debe seleccionar un motivo de baja";
            //        return false;
            //    }
            //}

            //DateTime fecha;

            //if (txtFechaBajaConsultada.Visible == true)
            //{
            //    if (txtFechaBajaConsultada.Text == string.Empty || !DateTime.TryParse(txtFechaBajaConsultada.Text, out fecha))
            //    {
            //        errores = "Debe ingresar una fecha de baja valida";
            //        return false;
            //    }
            //}

            //if (txtObservacionBajaConsultada.Visible == true)
            //{
            //    if (txtObservacionBajaConsultada.Text == string.Empty)
            //    {
            //        errores = "Debe ingresar un comentario sobre la baja";
            //        return false;
            //    }
            //}
            return true;
        }

        protected void GrdColaboradores_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            LinkButton lnkButtonActDes;
            
            if (e.Row.RowType == DataControlRowType.DataRow)
            {                
                lnkButtonActDes = (LinkButton)e.Row.Cells[5].Controls[0];

                
                if (!string.IsNullOrEmpty(e.Row.Cells[11].Text))
                {
                    lnkButtonActDes.Text = "Activar";
                    lnkButtonActDes.CommandName = "Activar";
                }
                else
                {
                    lnkButtonActDes.Text = "Desactivar";
                    lnkButtonActDes.CommandName = "Desactivar";

                    lnkButtonActDes.Attributes.Add("onclick", "if (!confirm('Está seguro que desea desactivar al Colaborador?'))return false;");
                }
                //Oculto la columna que muestra la Fecha de Baja
                //e.Row.Cells[11].Visible = false;
            }
        }

        protected void cmdCancelarBaja_Click(object sender, ImageClickEventArgs e)
        {
            this.mpeBajaColaborador.Hide();
        }

        protected void cmdBuscar_Click(object sender, ImageClickEventArgs e)
        {
            Session["ABMColaboradores.GrdColaboradores.PageIndex"] = 0;
            this.BuscarDatos( null, txtLegajoBuscar.Text, null, txtApellidoBuscar.Text, null, null, null, null, chkActivo.Checked );

        }

        protected bool ValidarDatosBaja ( out string errores )
        {
            errores = string.Empty;

            if (DdlMotivoBaja.SelectedValue == "-1")
            {
                errores = "Debe seleccionar un motivo de baja";
                return false;
            }

            DateTime fecha;

            if (txtFechaBaja.Text == string.Empty || !DateTime.TryParse( txtFechaBaja.Text, out fecha ))
            {
                errores = "Debe indicar la fecha de baja";
                return false;
            }


            if (txtObservacionBaja.Text == string.Empty)
            {
                errores = "Debe indicar la observación de baja";
                return false;
            }

            return true;
        }

        protected void cmdAceptarBaja_Click ( object sender, ImageClickEventArgs e )
        {
            try
            {
                List<Colaborador> lstColaborador = new List<Colaborador>();
                lstColaborador = (List<Colaborador>)Session["ABMColaboradores.lstColaboradores"];
                Colaborador colaboradorDesactivar = new Colaborador();

                Int16 indiceFila = (Int16)Session["ABMColaboradores.IndiceFila"];

                Int64 idColaborador = Convert.ToInt64( GrdColaboradores.DataKeys[indiceFila].Values["IdColaborador"] );

                foreach (Colaborador colaborador in lstColaborador)
                {
                    if (colaborador.IdColaborador == idColaborador)
                    {
                        colaboradorDesactivar = colaborador;
                        break;
                    }
                }

                string errores = string.Empty;

                if (!this.ValidarDatosBaja( out errores ))
                {
                    this.RegistrarMensajeJavascript( "Error", errores );
                    return;
                }

                colaboradorDesactivar.FechaBaja = Convert.ToDateTime( txtFechaBaja.Text );

                GestorColaborador gestorColaborador = new GestorColaborador();
                gestorColaborador.Desactivar( colaboradorDesactivar );

                colaboradorDesactivar.ObservacionesBaja = txtObservacionBaja.Text;
                colaboradorDesactivar.MotivoBaja = new MotivoBajaColaborador();
                colaboradorDesactivar.MotivoBaja.Id = Convert.ToInt64( DdlMotivoBaja.SelectedValue );

                gestorColaborador.Modificar( colaboradorDesactivar );

                BuscarDatos( null, null, null, null, null, null, null, null, chkActivo.Checked );
                this.UpdListadoColaboradores.Update();
                LimpiarCampos();
            }

            catch (Exception)
            {
                this.RegistrarMensajeJavascript( "Error", "No se pudo desactivar el colaborador" );
                return;
            }
        }

    }
}